﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using webui.Models;

namespace webui.Filters
{
    public class LoginValidateAttribute : System.Web.Mvc.AuthorizeAttribute
    {

        #region 1.0 验证方法 - 在 ActionExcuting过滤器之前执行
        /// <summary>
        /// 验证方法 - 权限过滤器在 ActionExcuting过滤器之前执行
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext)
        {
            //获取区域名
            string strArea = filterContext.RouteData.DataTokens.Keys.Contains("area") ? filterContext.RouteData.DataTokens["area"].ToString().ToLower() : "";
            //要验证的区域名 集合
            List<string> listAreaLimite = new List<string>() { "admin" };
            //1.如果请求的 Admin 区域里的 控制器类和方法，那么就要验证权限
            if (!string.IsNullOrEmpty(strArea) && listAreaLimite.Contains(strArea))//监测区域名 是否为 admin
            {

                //2.检查 被请求的 方法 和 控制器是否有 Skip 标签，如果有，则不验证；如果没有，则验证

                //0.验证是否要 跳过 登陆 和 权限验证，如果不要，则继续判断
                if (!DoesSkip<SkipAttribute>(filterContext))
                {
                    bool isLogin = false;
                    //1.是否要跳过 验证登陆
                    if (!DoesSkip<SkipLoginAttribute>(filterContext))
                    {
                        #region 1.验证用户是否登陆(Session && Cookie)
                        //1.验证用户是否登陆(Session && Cookie)
                        isLogin = OperateContext.Current.IsLogin();
                        if (!isLogin)
                        {
                            filterContext.Result = OperateContext.Current.Redirect("/admin/admin/login", filterContext.ActionDescriptor);
                        }
                        #endregion
                    }
                    //2.如果已经登陆，则判断 是否要跳过 权限验证；如果没有登陆，则不需要验证了
                    if (isLogin && !DoesSkip<SkipPemissionAttribute>(filterContext))
                    {
                        #region //2.验证登陆用户 是否有访问该页面的权限
                        //2.获取 登陆用户权限
                        string strAreaName = filterContext.RouteData.DataTokens["area"].ToString().ToLower();
                        string strContrllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName.ToLower();
                        string strActionName = filterContext.ActionDescriptor.ActionName.ToLower();
                        string strHttpMethod = filterContext.HttpContext.Request.HttpMethod;

                        if (!OperateContext.Current.HasPemission(strAreaName, strContrllerName, strActionName, strHttpMethod))
                        {
                            filterContext.Result = OperateContext.Current.Redirect("/admin/admin/login?msg=noPermission", filterContext.ActionDescriptor);
                        }
                        #endregion
                    }
                }
                //}#endregion
            }
        }
        #endregion


        /// <summary>
        /// 是否跳过验证
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="filterContext"></param>
        /// <returns></returns>
        bool DoesSkip<T>(System.Web.Mvc.AuthorizationContext filterContext) where T : Attribute
        {
            //方法和控制器贴了标签。
            if (!filterContext.ActionDescriptor.IsDefined(typeof(T), false) &&
                    !filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(T), false))
            {
                return false;
            }
            return true;
        }



    }
}